﻿using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;

namespace CommonComponents.Model
{
    /// <summary>
    /// Estructura de datos básic para un punto geográfico
    /// </summary>
    [DataContract]
    public class Location
    {
        #region Constructor
        /// <summary>
        /// Creo un nueva localizción con un nombre dado
        /// </summary>
        /// <param name="name">Nombre de la localizción</param>
        public Location(string name)
        {
            _name = name;
            _innerLocations = new SortedList<string, Location>();
        }

        /// <summary>
        /// Constructor vacio
        /// </summary>
        public Location()
        {
        }

        #endregion

        #region Attributes
        /// <summary>
        /// Nombre de la localización
        /// </summary>
        private string _name;
        /// <summary>
        /// Localizaciones internas
        /// </summary>
        private readonly SortedList<string, Location> _innerLocations;
        #endregion

        #region Properties
        /// <summary>
        /// Nombre de la localización
        /// </summary>
        [DataMember]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        /// <summary>
        /// Localizaciones internas de esta localización
        /// </summary>
        [DataMember]
        public Location[] InnerLocations
        {
            get { return _innerLocations.Values.ToArray(); }
            set 
            {
                _innerLocations.Clear();
                foreach (Location loc in value)
                {
                    _innerLocations.Add(loc._name, loc);
                }
            }
        }
        #endregion

        #region Public Methods
        /// <summary>
        /// Agrega el nombre de una nueva localización interna a esta localización.
        /// Se crea una nueva localización internamente
        /// </summary>
        /// <param name="locationName">Nombre de la nueva localización</param>
        public void AddInnerLocation(string locationName)
        {
            _innerLocations.Add(locationName, new Location(locationName));
        }

        /// <summary>
        /// Agrega un nueva localización interna a esta localización indexada
        /// al nombre dado. (Por lo general asociada a su propio nombre)
        /// </summary>
        /// <param name="locationName"></param>
        /// <param name="location"></param>
        public void AddInnerLocation(string locationName, Location location)
        {
            _innerLocations.Add(locationName, location);
        }

        /// <summary>
        /// Obtiene la localización asociada al nombre dado
        /// </summary>
        /// <param name="name">Nombre asociado a la localización</param>
        /// <returns>Localización asociada</returns>
        public Location GetInnerLocation(string name)
        {
            return _innerLocations[name];
        }
        #endregion

    }
}
